.TITLE DRRAS .IDENT /10.04/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ; D. N. CUTLER 4-SEP-73 ; ; PREVIOUSLY MODIFIED BY: ; ; T. M. MARTIN ; B. S. MCCARTHY ; M. S. FOX ; J. M. LAWLER ; ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; J. W. BERZLE ; J. R. KAUFFMAN ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ; ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY: ; ; G. N. LARSEN ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.4 BY: ; ; B. S. MCCARTHY 9-JUL-90 10.02 ; ; BM430 -- ADD UNIVERSAL RECEIVER TASK ; ; BM431 -- ADD SEND AND UNSTOP DIRECTIVE ; ; MODIFIED FOR RSX-11M-PLUS V4.5 BY: ; ; D. CARROLL 20-OCT-1993 10.03 ; ; DC242 -- INSURE THAT THE UNIVERSAL RECEIVER TASK ; IS ACTIVATED IN THE CASE OF SDAT$/RQST$ ; IN WHICH URT... WILL NOT BE ACTIVATED ; ; Modified for RSX-11M-PLUS V4.6 by: ; ; D. Carroll 18-Oct-1995 10.04 ; DC404 - Include PSECT statment to allow ICB pool to be ; fully expanded during sysgen. ; ; RECEIVE AND SEND DIRECTIVES ; ; MACRO LIBRARY CALLS ; .MCALL HDRDF$,TCBDF$ .IF DF N$$DIR .MCALL LNMDF$ LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETS .ENDC ;DF N$$DIR HDRDF$ ;DEFINE TASK HEADER OFFSETS TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404 ;+ ; **-$DRREC-(VARIABLE LENGTH) RECEIVE DATA AND RECEIVE DATA OR EXIT ; **-$DRRCS-(VARIABLE LENGTH) RECEIVE DATA OR STOP ; ; THESE DIRECTIVES INSTRUCT THE SYSTEM TO DEQUEUE A DATA BLOCK FROM THE ; ISSUING TASK'S RECEIVE QUEUE. IF THE DIRECTIVE IS RECEIVE DATA OR EXIT, ; THEN A TASK EXIT WILL BE EFFECTED IF NO DATA IS QUEUED. IF THE DIREC- ; TIVE IS RECEIVE OR STOP, THEN THE ISSUING TASK WILL BE SUSPENDED IF NO ; DATA IS QUEUED. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(75., 77., OR 139.),DPB SIZE(4. OR 6.). ; WD. 01 -- FIRST HALF OF SENDER TASK NAME OR 0 FOR ANY TASK. ; WD. 02 -- SECOND HALF OF SENDER TASK NAME. ; WD. 03 -- ADDRESS OF RECEIVE BUFFER. ; WD. 04 -- NUMBER OF WORDS TO RECEIVE (VARIABLE RECEIVE ONLY). ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE SECOND WORD IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED IF DATA IS RECEIVED. ; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED IF NO DATA IS ; RECEIVED ON RECEIVE OR STOP. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF NO DATA ; IS QUEUED IN TASK'S RECEIVE QUEUE ON RECEIVE ; DATA. ; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING ; TASK IS AT AST STATE AND ISSUED THE RECEIVE OR ; STOP DIRECTIVE. ; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF THE ; ISSUING TASK IS A SLAVE TASK AND HAS AN ; ACTIVE GROUP GLOBAL EVENT FLAG CONTEXT ; AND THE NEXT RECEIVE PACKET WILL CHANGE ; THE TASK'S GROUP NUMBER. ; ; THE FORMAT OF A FIXED LENGTH SEND PACKET IS AS FOLLOWS: ; ; WD. 00 -- RECEIVE QUEUE LINK WORD. ; WD. 01 -- FIRST WORD OF SENDER TASK NAME. ; WD. 02 -- SECOND WORD OF SENDER TASK NAME. ; WD. 03 THRU 15. -- CONTENTS OF THE SEND BUFFER. ; WD. 16. -- TI UCB ADDRESS OF SENDER TASK. ; WD. 17. -- CURRENT UIC ; WD. 18. -- FIRST WORD OF TARGET MU TASK NAME. ; WD. 19. -- SECOND WORD OF TARGET MU TASK NAME. ; WD. 20. -- CONTEXT BLOCK POINTER (IF NAME DIRECTORY SUPPORT) ; ; THE FORMAT OF A VARIABLE LENGTH SEND PACKET IS AS FOLLOWS: ; ; WD. 00 -- RECEIVE BY REFERENCE QUEUE LINK WORD. ; WD. 01 -- NUMBER DATA WORDS + 2 (FOR SENDER TASK NAME). ; WD. 02 -- FIRST WORD OF SENDER TASK NAME. ; WD. 03 -- SECOND WORD OF SENDER TASK NAME. ; WD. 04 THRU N -- DATA WORDS TO BE SENT. ; WD. N+1 -- TI UCB ADDRESS OF SENDER TASK. ; WD. N+2 -- CURRENT UIC ; WD. N+3 -- FIRST WORD OF TARGET MU TASK NAME. ; WD. N+4 -- SECOND WORD OF TARGET MU TASK NAME. ; WD. N+5 -- CONTEXT BLOCK POINTER (IF NAME DIRECTORY SUPPORT) ; ; NOTE: FOR SYSTEMS WITH SECONDARY POOL SUPPORT, ALL PACKETS ; FOR SENDS AND RECEIVES ARE ALLOCATED ; FROM THE SECONDARY POOL AND THE FIXED LENGTH SEND ; BECOMES A VARIABLE LENGTH SEND OF LENGTH 13. ; ;- ; ; * * * * * N O T E W E L L * * * * * ; ; THESE ROUTINES CURRENTLY WORK ONLY BECAUSE THEY ARE IN THE ; ROOT OF THE EXEC AND APPEAR TO BE IN THE FIRST DIRECTIVE ; COMMON. IF THEY ARE EVER MOVED, IN ADDITION TO THE CHANGES ; TO MAPPING NECESSARY, IT WILL BE NECESSARY TO CHANGE THE ; CODE WHICH STUFFS THE NEW DSW ON THE STACK TO ACCOMODATE ; THE DIFFERING STACK FORMATS ON SYSTEMS WITH DIRECTIVE ; COMMONS. ; .ENABL LSB 60$: DRSTS D.RS89 ;INVALID RECEIVE BUFFER SIZE 70$: DRSTS D.RS99 ;INVALID DPB SIZE $DRRCS::TST (R2) ;ISSUING TASK AT AST STATE? BPL $DRREC ;IF PL NO DRSTS D.RS80 ;ISSUING TASK IS AT AST STATE $DRREC::CLR -(SP) ;INIT ERROR CODE MOV #15.,R1 ;ASSUME THIS IS A FIXED LENGTH RECEIVE MOV R1,-(SP) ;SAVE NUMBER OF DATA WORDS ASL R1 ;CONVERT TO BYTES .IF DF X$$HDR MOVB H.CUIC+1(R4),-(SP) ;SAVE GRP CODE - HEADER UNMAPPED .IFF MOV R4,-(SP) ;SAVE HEADER ADDRESS .ENDC MOV (R3)+,-(SP) ;SAVE FIRST HALF OF SENDER TASK NAME MOV (R3)+,-(SP) ;SAVE SECOND HALF OF SENDER TASK NAME CMPB $DICSV+1,#4. ;FIXED LENGTH RECEIVE? BEQ 102$ ;IF EQ YES CMPB $DICSV+1,#6. ;VARIABLE LENGTH RECEIVE? BNE 70$ ;IF NE NO MOV 2(R3),R1 ;GET SIZE TO RECEIVE BEQ 60$ ;IF EQ ERROR - ILLEGAL SIZE CMP R1,#P$$MAX ;VALID SIZE? BLOS 101$ ;IF LOS YES CMP $TKTCB,$URTCB ;IS TARGET THE UNIVERSAL RECEIVER TASK? BNE 60$ ;IF NE NO CMP R1,#P$$MAX+2 ;VALID SIZE? BHI 60$ ;IF HI NO 101$: ADD #2,R1 ;TWO EXTRA WORDS FOR SENDER TASK NAME MOV R1,6(SP) ;SAVE THE SIZE TO RECEIVE + 2 ASL R1 ;CONVERT SIZE TO BYTES 102$: MOV (R3),R3 ;GET ADDRESS OF RECEIVE BUFFER CALL $ACHKP ;ADDRESS CHECK RECEIVE BUFFER MOV R3,R4 ;SAVE ADDRESS OF RECEIVE BUFFER MOV (SP)+,R3 ;RETRIEVE 2ND HALF OF SENDER TASK NAME MOV (SP)+,R2 ;RETRIEVE FIRST HALF OF SENDER TASK NAME MOV R5,R0 ;COPY TCB ADDRESS ADD #T.RCVL,R0 ;POINT TO RECEIVE LIST CALL $GTRPK ;GET RECEIVE DATA PACKET AND MAP TO IT BCS 20$ ;IF CS THERE IS NONE MOV (SP)+,R2 ;GET SAVED GROUP CODE/HEADER ADDRESS BIT #T3.SLV,T.ST3(R5) ;ISSUING TASK A SLAVE TASK ? BEQ 105$ ;IF EQ NO TSTB T.GGF(R5) ;TASK HAVE ACTIVE GROUP GLOBAL CONTEXT ? BEQ 105$ ;IF EQ NO MOV @#120002,R3 ;GET LENGTH OF DATA +2 (WORDS) ASL R3 ;CONVERT TO BYTES .IF DF X$$HDR CMPB R2,120007(R3) ;WILL UIC GROUP CHANGE ? .IFF CMPB H.CUIC+1(R2),120007(R3) ;WILL UIC GROUP CHANGE ? .ENDC BEQ 105$ ;IF EQ NO DRSTS D.RS17 ;SLAVE TASK HAS GRP GLOBAL CONTEXT ACTIVE 105$: CALL $GTSPK ;DEQUEUE SPECIFIED PACKET MOV #120002,R1 ;POINT TO THE NUMBER OF WORDS SENT CMP (SP),(R1) ;BUFFER SMALLER THAN DATA SENT? BEQ 2$ ;IF EQ NO BLO 201$ ;IF LO YES MOV (R1),(SP) ;KEEP THE NUMBER OF WORDS SENT BR 2$ ; 201$: INC 2(SP) ;INDICATE DATA HAS BEEN TRUNCATED 2$: ;REFERENCE SYMBOL BIT #T3.SLV,T.ST3(R5) ;IS RECEIVER A SLAVE TASK? BEQ 5$ ;IF EQ NO .IF DF V$$TRM ; ; IF TI OF THE RECEIVER IS A VT, DECREMENT THE VT OFFSPRING COUNT, ; DEALLOCATE THE VT IF REQUIRED, AND CLEAR ANY LUNS WHICH MAY HAVE ; BEEN ASSIGNED TO THE SLAVE TASK'S TI (VT). ; NOTE -- COUNT IS DECREMENTED WHEN CHANGING THE TI AWAY FROM THE ; CURRENT VT. FOR THIS REASON, THE VT OFFSPRING COUNT IS NOT ; DECREMENTED IF A RECEIVE DATA IS ISSUED AND THE QUEUE IS EMPTY. ; MOV R1,-(SP) ;SAVE PACKET ADDRESS CALL $TICLR ;DECREMENT VT OFFSPRING COUNT AND ;CLEAR OUT LUNS MOV (SP)+,R1 ;RESTORE PACKET ADDRESS .ENDC MOV R1,R0 ;COPY PACKET ADDRESS MOV (R1),R3 ;GET NUMBER OF DATA WORDS SENT +2 ASL R3 ;CONVERT TO BYTES ADD R3,R0 ;POINT TO SENDER'S TI UCB ADDRESS IN PKT TST (R0)+ ; MOV (R0)+,T.UCB(R5) ;SET TI ADDRESS OF RECEIVER .IF DF X$$HDR MOV #KISAR6,R3 ;GET ADDRESS OF KERNEL APR6 MOV (R3),-(SP) ;SAVE CURRENT MAPPING (USER BUFFER) MOV $SAHDB,(R3) ;MAP NONRESIDENT HEADER MOV $SAHPT,R2 ;GET HEADER ADDRESS MOV (R0),H.CUIC(R2) ;SET CURRENT UIC OF RECEIVER MOV (R0),H.DUIC(R2) ;SET DEFAULT UIC OF SENDER MOV (SP)+,(R3) ;RESTORE MAPPING TO USER BUFFER .IFF MOV $HEADR,R2 ;GET TASK HEADER ADDRESS MOV (R0),H.CUIC(R2) ;SET CURRENT UIC OF RECEIVER MOV (R0),H.DUIC(R2) ;SET DEFAULT UIC OF RECEIVER .ENDC .IF DF N$$DIR MOV R1,-(SP) ;SAVE R1 MOV T.CTX(R5),R1 ;GET CURRENT CONTEXT BLOCK BEQ 3$ ;IF EQ, NONE CALL $DLCTX ;DELETE CURRENT CONTEXT BLOCK 3$: MOV 6(R0),T.CTX(R5) ;GET CONTEXT BLOCK FROM PACKET MOV (SP)+,R1 ;RESTORE R1 .ENDC ;DF N$$DIR 5$: ;REFERENCE SYMBOL TST (R1)+ ;POINT TO SENDER TASK NAME MOV (SP)+,R2 ;GET NUMBER OF WORDS TO MOVE CMPB $DICSV+1,#6 ;VARIABLE LENGTH RECEIVE? BNE 10$ ;IF NE NO MOV R2,4(SP) ;RETURN IN DSW NUMBER OF WORDS RECEIVED 10$: MOV (R1)+,(R4)+ ;MOVE DATA BLOCK TO TASK BUFFER DEC R2 ;ANY MORE WORDS TO MOVE? BNE 10$ ;IF NE YES MOV KISAR5,R0 ;GET ADDRESS OF PACKET MOV @#120002,R1 ;GET NUMBER OF WORDS SENT .IF DF N$$DIR ADD #<7.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .IFF ADD #<6.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .ENDC ;DF N$$DIR ASH #-5,R1 ;CONVERT TO 32. WORD UNITS CALL $DESEC ;DEALLOCATE RECEIVE PACKET TO SEC POOL TST (SP)+ ;CLEAN THE STACK AND TEST FOR ERROR BNE 45$ ;IF NE DATA HAS BEEN TRUNCATED .IF DF D$$PAR .IF NDF K$$DAS MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I SPACE .ENDC ;NDF K$$DAS .ENDC ;DF D$$PAR RETURN ; 20$: ;REFERENCE LABEL .IF DF X$$HDR TST (SP)+ ;CLEAN STACK MOV $SAHPT,R4 ;GET ADDRESS OF HEADER MOV $SAHDB,KISAR6 ;AND MAP HEADER .IFF MOV (SP)+,R4 ;RETRIEVE HEADER ADDRESS .ENDC CMP (SP)+,(SP)+ ;CLEAN STACK CMPB $DICSV,#77. ;RECEIVE DATA OR EXIT DIRECTIVE? BNE 30$ ;IF NE NO JMP $DREXT ;EXIT TASK 30$: CMPB $DICSV,#139. ;RECEIVE OR STOP DIRECTIVE? BNE 40$ ;IF NE NO CALL $STPCT ;STOP CURRENT TASK DRSTS D.RS22 ;RETURN IS.SET 40$: DRSTS D.RS8 ;NO PACKET TO RECEIVE 45$: DRSTS D.RS15 ;RECEIVE BUFFER TOO SMALL DATA TRUNCATED ;+ ; **-$DRSND-SEND DATA ; SEND DATA AND UNSTOP ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A THIRTEEN WORD DATA BLOCK ; IN A SPECIFIED TASK'S RECEIVE QUEUE. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(71.),DPB SIZE(5. OR 8.). ; DIC(179.),DPB SIZE(5. OR 8.). FOR SEND AND UNSTOP ; WD. 01 -- FIRST HALF OF RECEIVER TASK NAME. ; WD. 02 -- SECOND HALF OF RECEIVER TASK NAME. ; WD. 03 -- ADDRESS OF THIRTEEN WORD DATA BLOCK. ; WD. 04 -- EVENT FLAG NUMBER (OPTIONAL). ; WD. 05 -- NUMBER OF WORDS TO SEND (VARIABLE LENGTH SEND ONLY). ; ; INPUTS: ; ; R0=ADDRESS OF THE TCB OF THE RECEIVER TASK. ; R1=ADDRESS OF THE TASK STATUS WORD OF THE RECEIVER TASK. ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE DATA BLOCK ADDRESS IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT ; CORE IS AVAILABLE TO QUEUE THE DATA BLOCK. ; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF RECEIVER ; TASK IS AN ANCILLARY CONTROL PROCESSOR. ; ; NOTE: FOR SYSTEMS WITH SECONDARY POOL SUPPORT, ALL SENDS AND ; RECEIVES USE PACKETS ALLOCATED FROM THE SECONDARY POOL. ; ; ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS ; AND PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPE ; TCB IN POOL UPON ENTRY. THEREFORE, DO NOT ASSUME ; THAT THE TASK HEADER IS MAPPED. ; ;- 270$: DRSTS D.RS2 ;SET DIRECTIVE STATUS 275$: DRSTS D.RS98 ;SET DIRECTIVE STATUS 360$: DRSTS D.RS89 ;INVALID RECEIVE BUFFER SIZE 370$: DRSTS D.RS99 ;INVALID DPB SIZE $DRSND:: ; BIT #T3.ACP!T3.NSD,T.ST3(R0) ;SENDS ALLOWED TO RECEIVER? BNE 270$ ;IF NE, NO MOV T.ST3(R0),-(SP) ;SAVE 3RD STATUS WORD OF TCB MOV R0,-(SP) ;SAVE TCB ADDRESS OF RECEIVER TASK MOV #13.,R1 ;ASSUME THIS IS A FIXED LENGTH SEND MOV R1,-(SP) ;SAVE NUMBER OF WORDS TO SEND ASL R1 ;CONVERT TO BYTES MOVB 2(R3),-(SP) ;SAVE EVENT FLAG NUMBER CMPB $DICSV+1,#5. ;FIXED LENGTH SEND DIRECTIVE? BEQ 210$ ;IF EQ YES CMPB $DICSV+1,#7. ;SEND REQUEST AND CONNECT? BEQ 210$ ;IF EQ YES BLO 370$ ;IF LO, ERROR CMPB $DICSV+1,#9. ;IS IT SOME FORM OF VARIABLE SEND BHI 370$ ;IF HI NO, ERROR BNE 205$ ;IF NE, IT MUST BE VALID CMPB $DICSV,#71. ;IS THIS A VSDA$ BEQ 370$ ;IF EQ YES, ILLEGAL DPB SIZE 205$: ;REFERENCE LABEL MOV 4(R3),R1 ;GET NUMBER OF WORDS TO SEND BEQ 360$ ;IF EQ ILLEGAL SIZE CMP R1,#P$$MAX ;VALID SIZE? BHI 360$ ;IF HI NO MOV R1,2(SP) ;SAVE THE NUMBER OF WORDS TO BE SENT ASL R1 ;CONVERT TO BYTES 210$: MOV (R3),R3 ;GET ADDRESS OF DATA BUFFER BIT #1,R3 ;ODD ADDRESS? BNE 275$ ;IF NE, YES - ERROR MOV R3,R0 ;MOV BUFFER ADDR FOR CALL CALL $ACHRO ;ADDRESS CHECK DATA BUFFER BCS 275$ ;IF CS, ERROR CALL $RELOC ;RELOCATE USER BUFFER MOV R1,KISAR6 ;MAP TO USER BUFFER MOV R2,R3 ;SUBSTITUTE NEW VIRTUAL ADDRESS MOVB (SP)+,R0 ;RETRIEVE OPTIONAL EVENT FLAG NUMBER CALL $SETF ;SET THE EVENT FLAG CMP 2(SP),$URTCB ;IS TARGET THE UNIVERSAL RECEIVER TASK BNE 220$ ;IF NE NO CMP R5,$URTCB ; IS THE SENDER ALSO URT...? BEQ 270$ ; YES, FORCE THE IE.INS ERROR ADD #2,(SP) ;ADJUST SIZE OF PACKET TO FIT TASKNAME 220$: MOV (SP),R1 ;GET NUMBER OF WORDS TO SEND .IF DF N$$DIR ADD #<9.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .IFF ADD #<8.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .ENDC ;DF N$$DIR CMP R5,$URTCB ;SENDING FROM THE UNIVERSAL RECEIVER? BNE 222$ ; IF NE, NOPE, CONTINUE CMP (SP),#15. ; IS URT SENDING AT LEAST 15 WORDS? BLO 222$ ; IF LO, NOPE, WANTS TO IDENTIFY ITSELF SUB #2.,R1 ; DECREASE SIZE BY TWO, URT WILL INCLUDE SENDER 222$: ASH #-5,R1 ;CONVERT TO 32. WORD UNITS CALL $ALSEC ;ALLOCATE A PACKET BCC 225$ ; CC, WE HAVE THE PACKET JMP 265$ ;IF CS ALLOCATION FAILURE 225$: CLR -(SP) ;RESERVE A WORD ON THE STACK MOV 2(SP),(SP) ;COPY WORD COUNT MOV KISAR5,2(SP) ;SAVE KERNEL APR 5 MOV R0,KISAR5 ;MAP THE PACKET THROUGH APR 5 MOV #120002,R0 ;POINT TO SECOND WORD OF THE PACKET MOV (SP),(R0)+ ;SAVE NUMBER OF DATA WORDS IN PACKET CMP R5,$URTCB ; IS THE SENDER URT? BNE 227$ ; IF NE, NOPE, INCLUDE TASK NAME CMP (SP),#15. ; IS URT SENDING AT LEAST 15 WORDS? BHIS 230$ ; IF HIS, YES, CONTINUE 227$: ADD #2,-2(R0) ;TWO EXTRA WORDS FOR SENDER TASK NAME MOV T.NAM(R5),(R0)+ ;INSERT SENDER TASK NAME IN SEND PACKET MOV T.NAM+2(R5),(R0)+ ; CMP 4(SP),$URTCB ;IS TARGET THE UNIVERSAL RECEIVER TASK? BNE 230$ ;IF NE NO MOV $DICSV+2,(R0)+ ;INSERT NAME OF REAL TARGET TASK IN PACKET MOV $DICSV+4,(R0)+ ; SUB #2,(SP) ;ADJUST COPY COUNT 230$: MOV (SP)+,R2 ;SET LOOP COUNT 240$: MOV (R3)+,(R0)+ ;MOVE DATA TO SEND PACKET DEC R2 ;ANY MORE WORDS TO MOVE? BNE 240$ ;IF NE YES .IF DF V$$TRM MOV T.UCB(R5),R1 ;GET ADDRESS OF TI UCB OF SENDER MOV @R1,R2 ;DETERMINE DCB ADDRESS CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINAL? BNE 245$ ;IF NE NO MOV 4(SP),R2 ;GET TCB ADDRESS OF RECEIVER TASK BIT #T3.SLV,R2 ;IS RCVR TASK A SLAVE TASK? BEQ 245$ ;IF EQ NO INCB U.OCNT(R1) ;INCREMENT VT OFFSPRING COUNT 245$: MOV R1,(R0)+ ;SET UCB ADDRESS IN PACKET .IFF MOV T.UCB(R5),(R0)+ ;SET UCB ADDRESS IN PACKET .ENDC .IF DF X$$HDR MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER MOV $SAHPT,R4 ;GET ADDRESS OF CURRENT TASK HEADER .ENDC MOV H.CUIC(R4),(R0)+ ;SET CURRENT (PROTECTION) UIC .IF DF R$$DSP MOV $TNAME,(R0)+ ;STORE FIRST WORD OF TARGET MU TASK NAME MOV $TNAME+2,(R0)+ ;STORE SECOND WORD .ENDC .IF DF N$$DIR MOV 4(SP),R2 ;GET TCB ADDRESS OF RECEIVER TASK BIT #T3.SLV,R2 ;IS RCVR TASK A SLAVE TASK? BEQ 250$ ;IF EQ, NO MOV T.CTX(R5),(R0) ;PUT CONTEXT BLOCK INTO PACKET BEQ 250$ ;IF EQ, NONE MOV KISAR5,-(SP) ;SAVE CURRENT MAPPING MOV (R0),KISAR5 ;MAP CONTEXT BLOCK INCB C.REF+120000 ;INCREMENT REFERENCE COUNT MOV (SP)+,KISAR5 ;RESTORE MAPPING 250$: ;REFERENCE LABEL .ENDC ;DF N$$DIR MOV 2(SP),R0 ;GET ADDRESS OF RECEIVER TASK'S TCB ADD #T.RCVL,R0 ;POINT TO RECEIVE LIST MOV KISAR5,R1 ;GET ADDRESS OF PACKET MOV $PTCPT,KISAR6 ;REMAP TCB IF IN SECONDARY POOL CALL $QSPIF ;INSERT PACKET IN THE RECEIVE LIST MOV (SP)+,KISAR5 ;RESTORE KERNEL APR 5 MOV #AS.RCA,R4 ;GET CODE FOR RECEIVE DATA AST MOV (SP)+,R5 ;RETRIEVE RECEIVER TASK TCB ADDRESS TST (SP)+ ;REMOVE 3RD STATUS WORD CALL $DASTT ;DECLARE RECEIVE AST CMPB #179.,$DICSV ;WAS THIS A SEND AND UNSTOP ? BEQ 251$ ;IF EQ, YES, PROCESS SEND DATA AND UNSTOP CMP R5,$URTCB ; IS THIS THE UNIVERSAL RECEIVER TASK? BNE 260$ ; IF NE, NOPE, DECLATE SIGNIFICANT EVENT TST T.STAT(R5) ; IS THE TASK ALREADY ACTIVE? BPL 260$ ; IF PL, YES, JUST DECLARE SIGNIFICANT EVENT BR 255$ ; GO START UP THE TASK ... 251$: MOV R5,R0 ;GET TCB ADDRESS FOR UNSTOP CMP #120000,R0 ;IS IT A REAL TASK? BLOS 260$ ;IF LOS NO ADD #T.STAT,R0 ;POINT TO T.STAT TST (R0)+ ;SPECIFIED TASK ACTIVE? BMI 285$ ;IF MI NO BIT #T2.SEF,(R0) ;TASK STOPPED FOR EVENT FLAG BNE 280$ ;IF NE YES MOV #T2.STP,R2 ;PICK UP STOP BIT BIT R2,(R0) ;TASK CURRENTLY STOPPED? BNE 255$ ;IF NE YES TST (R0) ;AST IN PROGRESS? BPL 280$ ;IF PL NO ASL R2 ;SET PRE AST STOP BIT BIT R2,(R0) ;WAS TASK STOPPED? BEQ 280$ ;IF EQ NO, RETURN STATUS 255$: MOV R5,R0 ;GET TCB ADDRESS CALLR $EXRQN ;UNSTOP 260$: CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENT 265$: DRSTS D.RS1 ;ALLOCATION FAILURE 280$: DRSTS D.RS00 ;TASK ACTIVE BUT NOT STOPPED 285$: CMP R5,$URTCB ; IS THIS THE UNIVERSAL RECEIVER? BEQ 255$ ; IF EQ, YES, GO START IT UP ... DRSTS D.RS22 ;TASK NOT ACTIVE .DSABL LSB ;+ ; **-$GTRPK-GET RECEIVE DATA PACKET. ; ; THIS ROUTINE IS CALLED TO DEQUEUE A SPECIFIED PACKET FROM A QUEUE. ; ; INPUTS: ; ; R2=FIRST WORD OF TASK NAME. ; R3=SECOND WORD OF TASK NAME. ; R0=LIST HEAD ADDRESS. ; ; OUTPUTS: ; ; C=0 IF AN ENTRY HAS BEEN REMOVED FROM THE LIST. ; KISAR5 MAPS THE ENTRY. ; C=1 IF THE ENTRY IS NOT FOUND. ; ;- $GTRPK::MOV R0,R1 ;COPY LISTHEAD ADDRESS 10$: SEC ;ASSUME PACKET NOT FOUND MOV (R1),R1 ;GET ADDRESS OF NEXT ENTRY BEQ 100$ ;IF EQ END OF LIST MOV R1,KISAR5 ;MAP THE ENTRY THROUGH APR5 TST R2 ;TASK NAME SPECIFIED? BEQ 20$ ;IF EQ NO, DEQUEUE FIRST PACKET MOV #120000,R1 ;POINT TO PACKET LINK WORD CMP @#120004,R2 ;MATCH ON FIRST WORD OF TASK NAME? BNE 10$ ;IF NE NO CMP @#120006,R3 ;MATCH ON SECOND WORD OF TASK NAME? BNE 10$ ;IF NE NO MOV KISAR5,R1 ;GET PACKET ADDRESS 20$: ;REFERENCE LABEL 100$: RETURN ; .END